package com.estacionamientos

import com.estacionamientos.dto.EstacionamientoDTO;


class EstacionamientoController {
	EstacionamientoService estacionamientoService
	ImagenService imagenService
	
    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def index = {
        redirect(action: "list", params: params)
    }

    def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [estacionamientoInstanceList: Estacionamiento.list(params), estacionamientoInstanceTotal: Estacionamiento.count()]
    }

    def create = {
        def estacionamientoInstance = new Estacionamiento()
        estacionamientoInstance.properties = params
        return [estacionamientoInstance: estacionamientoInstance]
    }

    def save = {
        Estacionamiento estacionamientoInstance = new Estacionamiento(params)
		
		estacionamientoInstance = copyParams(estacionamientoInstance,params)
	
		Estacionamiento estacionamiento = estacionamientoService.saveObj(estacionamientoInstance)
        if (estacionamiento != null) {
            flash.message = "${message(code: 'default.created.message', args: [message(code: 'estacionamiento.label', default: 'Estacionamiento'), estacionamiento.id])}"
            redirect(action: "show", id: estacionamiento.id)
        }
        else {
            flash.message = "no se pudo crear el estacionamiento"
            render(view: "create", model: [estacionamientoInstance: estacionamientoInstance])
        }
    }

    def show = {
        def estacionamientoInstance = estacionamientoService.getObj(params.id)
        if (!estacionamientoInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'estacionamiento.label', default: 'Estacionamiento'), params.id])}"
            redirect(action: "list")
        }
        else {
            [estacionamientoInstance: estacionamientoInstance]
        }
    }

    def edit = {
        def estacionamientoInstance = estacionamientoService.getObj(params.id)
        if (!estacionamientoInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'estacionamiento.label', default: 'Estacionamiento'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [estacionamientoInstance: estacionamientoInstance]
        }
    }

    def update = {
        def estacionamientoInstance = estacionamientoService.getObj(params.id)
        if (estacionamientoInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (estacionamientoInstance.version > version) {
                    
                    estacionamientoInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'estacionamiento.label', default: 'Estacionamiento')] as Object[], "Another user has updated this Estacionamiento while you were editing")
                    render(view: "edit", model: [estacionamientoInstance: estacionamientoInstance])
                    return
                }
            }
			
			estacionamientoInstance = copyParams(estacionamientoInstance,params)
			
            //estacionamientoInstance.properties = params
            if (!estacionamientoInstance.hasErrors() && estacionamientoService.saveObj(estacionamientoInstance)) {
                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'estacionamiento.label', default: 'Estacionamiento'), estacionamientoInstance.id])}"
                redirect(action: "show", id: estacionamientoInstance.id)
            }
            else {
                render(view: "edit", model: [estacionamientoInstance: estacionamientoInstance])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'estacionamiento.label', default: 'Estacionamiento'), params.id])}"
            redirect(action: "list")
        }
    }

    def delete = {
        def estacionamientoInstance = estacionamientoService.getObj(params.id)
        if (estacionamientoInstance) {
            try {
                estacionamientoService.deleteObj(estacionamientoInstance)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'estacionamiento.label', default: 'Estacionamiento'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'estacionamiento.label', default: 'Estacionamiento'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'estacionamiento.label', default: 'Estacionamiento'), params.id])}"
            redirect(action: "list")
        }
    }
	
	def buscarEstacionamientos = {
		EstacionamientoDTO eDTO = new EstacionamientoDTO();
		
		eDTO.setTechado true
		
		List lista = estacionamientoService.buscarEstacionamientos(eDTO) 
		
		return lista;
	}
	
	def crearEstacionamientosDummies = {
		estacionamientoService.crearEstacionamientosDummies()
		
	}
	
	private Estacionamiento copyParams(Estacionamiento instance, Map parameters){
		Imagen imagen = new Imagen();
		Direccion dire = new Direccion()
		
		if(!parameters['direccion'].equals("")){
			dire.direccion =  parameters['direccionString']
		}
		if(!parameters['latitud'].equals("")){
			dire.latitud = new Float(parameters['latitud'])
		}
		if(!parameters['longitud'].equals("")){
			dire.longitud =  new Float(parameters['longitud'])
		}
		dire.save(flush: true)
		
		
		instance.direccion = dire
		if(parameters['myFile']!=null){
			imagen.properties = parameters['myFile']
			imagen = imagenService.saveObj(imagen);
			instance.foto = imagen
		}
		return instance
	}
	
	def getAll = {
		estacionamientoService.getAll();
	}
	
	def getEstacionamiento = {
		EstacionamientoDTO dto = estacionamientoService.getEstacionamiento(1L);
	}
}
